home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume24 / psroff3.0 / part01 next >
Encoding:
Internet Message Format  |  1991-10-09  |  54.0 KB

  1. Subject:  v24i096:  psroff, Troff to PostScript filter, Part01/19
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4.  
  5. Submitted-by: Chris Lewis <clewis@ferret.ocunix.on.ca>
  6. Posting-number: Volume 24, Issue 96
  7. Archive-name: psroff3.o/part01
  8.  
  9. Submitted-by: Chris Lewis <clewis@ferret.ocunix.on.ca>
  10. Archive-name: psroff3.0/Part01
  11.  
  12. #! /bin/sh
  13. # This is a shell archive.  Remove anything before this line, then feed it
  14. # into a shell via "sh file" or similar.  To overwrite existing files,
  15. # type "sh file -c".
  16. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  17. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  18. # Contents:  README MANIFEST adapters fonts.lj lib man tests utils
  19. #   utils/dodps.S utils/fonts utils/hpinterp.c utils/maps widths
  20. #   widths/widthjt widths/widthlj widths/widthlj3 widths/widthlj3u
  21. #   widths/widthps
  22. # Wrapped by clewis@ecicrl on Fri Apr  5 20:55:57 1991
  23. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 1 (of 19)."'
  26. if test -f 'README' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'README'\"
  28. else
  29.   echo shar: Extracting \"'README'\" \(20840 characters\)
  30.   sed "s/^X//" >'README' <<'END_OF_FILE'
  31. X        PSROFF RELEASE 3.0 README 2.17 91/04/02
  32. X
  33. X            Feb 19, 1991
  34. X            Chris Lewis
  35. X
  36. XPlease see the end of this file for my contact information.  If you have
  37. Xproblems installing/using this software, please contact me - I REALLY MEAN
  38. Xit - that's why I include my phone number.
  39. X
  40. XPlease read this document before configuring.  If you have difficulties,
  41. Xread the TROUBLE file.  See the INSTALL file for explicit installation
  42. Xinstructions.  See the LICENSE file for the copyright restrictions on
  43. Xthis software.
  44. X
  45. XNote that the name "psroff" clashes with a program contained in Adobe
  46. XTranscript and has caused endless confusion on the net.  To prevent
  47. Xconfusion, please refer to this package on the net as "Chris's psroff",
  48. Xor "non-Adobe psroff", or "psroff (not Transcript)" so that people will
  49. Xknow what you're talking about.  This software was unfortunately named
  50. Xpsroff accidentally, long before I knew that there was a thing called
  51. Xpsroff in Transcript.  Adobe is aware of the situation, but provided that
  52. Xeverybody is clear about which one they mean, there won't be a problem.
  53. X
  54. XNormal UNIX troff only prints its output on WANG C/A/T Phototypesetters.
  55. XThis package contains a generic interface between standard troff and
  56. Xother types of printers.  The package has a driver for PostScript printers
  57. X(Eg: Apple Laserwriters), a driver for HP LaserJet and DeskJet family
  58. Xprinters (including incremental downloading of PK or SFP format fonts),
  59. Xand Ditroff output options (tpscript driving Postscript printers,
  60. Xjetroff driving HP Laserjets, xtroff driving X.11, xproof driving DMD
  61. Xterminals, psdit), Sun PageView driving X windows, Display Postscript on
  62. XNeXT, DEC Windows and IBM RS/6000.
  63. X
  64. XIn fact, this package can be used to, in effect, upgrade CAT troff
  65. Xto be ditroff.  There are limitations (listed near the end), but you get
  66. Xwhat you pay for.
  67. X
  68. XNot only that, but this release supports ditroff *input*
  69. Xtoo.  Therefore, if you have any kind of troff, this will work for
  70. Xyou.
  71. X
  72. XApplicability/additional requirements:
  73. X    - You must have a troff - ALL versions of troff work with this
  74. X      software (CAT troff, ditroff, and groff).
  75. X    - Printers:
  76. X    - If you have a laserjet, you should be able to use this
  77. X      package directly.  Alternately, you can cause psroff
  78. X      to generate ditroff and drive jetroff with it.
  79. X      If you're going to drive the printer directly, you'll
  80. X      need additional fonts.
  81. X    - I believe the above comments also hold true for DeskJet
  82. X      printers.
  83. X    - If you have a postscript printer use postscript output.
  84. X      Or, generate ditroff and use tpscript.  Mine's better,
  85. X      so there! ;-)
  86. X    - If you have ditroff drivers (eg: dit2dvi etc.) you can
  87. X      configure psroff to drive them.
  88. X    - If you have a HPLJ III, this release comes with width
  89. X      tables for the built-in fonts.
  90. X    - If you're intending to use ditroff *input*, you should ensure
  91. X      that you have makedev, or the PD makedev clone "mkfont" from
  92. X      comp.sources.unix in 1988.  There was a bug in mkfont which
  93. X      bites on some machines, if your ditroff doesn't like the
  94. X      width tables mkfont generates, contact me, I have a teensy patch
  95. X      for it.
  96. X    - psxlate has support for n-up printing in Postscript.  For this
  97. X      you will also need the psnup distribution from comp.sources.misc
  98. X      (volume 16).
  99. X
  100. XBeware of the use of any ditroff-only-isms when you're using
  101. XCAT troff with psroff.  However, when used with ditroff, psroff
  102. Xshould be fully functional.
  103. X
  104. XThis is a formal release.  There are probably rough edges however,
  105. Xparticularly with fine-tuning width tables for specific printers and
  106. Xsome of the more esoteric ditroff configurations.  Further, there
  107. Xis some testing code for emulating ditroff drawing commands when
  108. Xused with CAT troff (see catconv).
  109. X
  110. XI encourage people to experiment with psroff (particularly the configuration
  111. Xfiles) and PLEASE PLEASE PLEASE send me your changes so that I can
  112. Xencorporate them into new releases and updates.
  113. X
  114. XThis package is currently in production at our site and has been so for
  115. Xover three years (in various stages of development).  By all
  116. Xappearances, this software is also in serious production in 100's
  117. Xof sites throughout the world.  The first version of psroff
  118. X(version 1.0) was posted in comp.sources.unix in October 1989.
  119. XPsroff release 2.0 was posted to alt.sources in November 1990.
  120. XAn extremely primitive program called "lcat" was the original precursor,
  121. Xit was posted to mod.sources in 1984 (which is why the copyrights go
  122. Xso far back).
  123. X
  124. XPlease note: I have discontinued the mailing list, because nothing
  125. Xever went out on it.
  126. X
  127. XPatches are shipped out through comp.sources.bugs and alt.sources.
  128. XA current list of FTP and UUCP access sites can be obtained by
  129. Xsending me mail.
  130. X
  131. XCredits:
  132. X
  133. XThe MANY people who've helped me get psroff working on a wider range
  134. Xof platforms and printers than I would have thought possible.  Elegant
  135. XCommunications for letting me do this, Ron Florence for assistance far
  136. Xbeyond the call of duty in getting Laserjet driving to work,
  137. XRick Richardson of PC Research, Liam Quin of SoftQuad, Mark Moraes at
  138. XU of Toronto, Dave Cahlander at Amdahl, Henry McGilton (and Pageview
  139. Xsupport) at Sun, Ronald Khoo at ibmpcug.uk, N K Krishnan for supplying
  140. Xthe HP LJIII widths in TFM format, and Adobe for not getting too upset
  141. Xabout the (accidental) name clash.
  142. X
  143. XRemarks:
  144. X
  145. X    - This was originally developed with a relatively old (eg: Lisa Xenix)
  146. X      CAT troff, and may be slightly incompatible with the latest versions of
  147. X      CAT troff.  See BSDHACK and FONT8/FONT4 in defs.h, however, I've yet
  148. X      to see a version of troff that needs either BSDHACK or FONT8.
  149. X
  150. X    - This supports some of the newer drawing commands available in
  151. X      groff and later versions of ditroff (eg: RS/6000)
  152. X
  153. X    - The PostScript driver is fully complete.  It uses the
  154. X      built-in fonts on the AppleLaser.  A few characters not in
  155. X      these fonts are faked by the invocation of drawing routines
  156. X      defined in the file "ps.lib" (which is the definitions of things
  157. X      needed by the driver).  Or the bracket font (also in ps.lib).
  158. X      Eg: 1/2, 1/4, 3/4, circle, bell system logo and box are
  159. X      constructed by PostScript subroutines and/or the bracket font.
  160. X      The Bell System logo isn't really - try this:
  161. X
  162. X        \s36\(bs\s0
  163. X
  164. X      The first person to correctly identify what it is (without reading
  165. X      ps.lib) gets a pat on the back ;-)
  166. X
  167. X      Two characters that don't exactly map properly are left and right
  168. X      hand.  I use double arrows instead.  This seems to be a relatively
  169. X      common convention.
  170. X
  171. X      There are some facilities for downloading postscript fonts (see
  172. X      HW in ps.fonts)
  173. X
  174. X    - The ditroff driver is fully complete and should work flawlessly
  175. X      provided that you use the proper width tables and you get the
  176. X      troff font:character -> ditroff font:character translations
  177. X      right.  You will probably want to take the ditroff width tables
  178. X      that come with your ditroff backend and run them through
  179. X      gfnttab (discussed later).
  180. X
  181. X    - The ditroff *input* handler is quite new, and hasn't been
  182. X      tested all that extensively.  Preliminary results seem to
  183. X      suggest that it does work, but documentation is scanty,
  184. X      and there's not much in the way of automated install or
  185. X      configuration checking for real ditroff.  See the DITROFF
  186. X      file for additional information.
  187. X
  188. X    - Fonts:
  189. X    - postscript driving - psroff uses what's on the printer - the
  190. X      configuration (ps.fonts) supplied corresponds to a subset
  191. X      of the AppleLaserwriter PLUS.  This should be satisfactory
  192. X      with all modern postscript printers (the original Laserwriter
  193. X      apparently is missing some of the fonts).  You may have
  194. X      problems with Helvetica Narrow fonts on printers like LN03's.
  195. X
  196. X      There are ways of building new fonts and downloading them.
  197. X      See pk2ps and the HW definitions in ps.fonts.
  198. X
  199. X    - ditroff driving - psroff uses whatever comes with the ditroff->
  200. X      printer converter.  Eg: with xtroff, psroff would use the
  201. X      font files that come with X windows.  With jetroff, psroff
  202. X      would use the font files that come with jetroff, etc.
  203. X      If you're driving a postscript printer via a ditroff backend,
  204. X      chances are that you're using fonts on the printer (eg: tpscript)
  205. X      and the "ps" widths will be satisfactory or can be manually
  206. X      tweaked slightly.
  207. X
  208. X    - HPLJ: to support downloading, you must obtain a set of font
  209. X      files that are sufficient for the sort of stuff you are doing.
  210. X      psroff has been designed to work with MATH8 encoded fonts
  211. X      (for the CAT S font), and ROMAN8 encoded fonts for all others
  212. X      (eg: R, I, B etc.).  Minimally, you should obtain from Hewlett
  213. X      Packard (or other sources) Roman, RomanItalic, and RomanBold
  214. X      all in ROMAN8 encodings, in the following point sizes:
  215. X
  216. X         6 7 8 9 10 11 12 14 16 18 20 22 24 28 36
  217. X
  218. X      From most sources these will be in HP "SFP" format.  I've
  219. X      included with psroff a set of PK (TeX) format font files
  220. X      for the S font in all of the sizes listed above.  These
  221. X      "S" fonts are designed to be as close to HP MATH8 as possible.
  222. X
  223. X      Font sources:
  224. X        - PC Research's Jetroff font distribution (comp.sources.unix &
  225. X          uunet).  Free (actually shareware).  Will give you 4 or 5 complete
  226. X          sets of fonts at all useful sizes.  See INSTALL and LASERFONTS.
  227. X          Probably good enough to use with the optimizer.
  228. X        - TeX PK fonts: will generate 6 or more complete sets of fonts,
  229. X          at all useful sizes, but some of the fonts will be slightly
  230. X          off in size.  Not good with the optimizer unless you can fire
  231. X          up metafont.
  232. X        - HP Soft fonts: HP font floppies are a good source of very
  233. X          nice looking fonts.
  234. X        - New HP product: there is a new package from HP which has a "street
  235. X          cost" of about $40 which includes several scalable typefaces and
  236. X          a PC program to generate them as SFP's at any size you want.
  237. X          THIS is the way to go.  Note that the Laserjet III personality
  238. X          for psroff uses Latin-1 and Math-8 and several other fonts to
  239. X          get a complete troff set, as opposed to Roman-8 and a fake
  240. X          Math-8 for laserjet + and laserjet II.  If you get the scalable
  241. X          typefaces from HP to use on your pre LJIII's, start with the
  242. X          lj3.fonts file (has the encodings and font selections)
  243. X
  244. X          See the LJIII file for more information on how the LJIII
  245. X          variant works, and some pointers on how to upgrade your pre-LJIII
  246. X          printers to work as well.
  247. X
  248. X      Psroff supports both PK and SFP format font files.
  249. X      Normal PK font files (eg: that come with TeX) do not have
  250. X      anything close to the same encoding as HP.  The S PKs I supply
  251. X      are specially reordered (actually a merge of four PKs) to
  252. X      reflect MATH8 encoding.  You can also use TeX PK fonts
  253. X      directly (after a name change to reflect psroff's file
  254. X      naming conventions) for the non-S fonts.  cmr, cmit, and
  255. X      cmb can be used for Roman, Italic and Bold respectively.
  256. X      *BEWARE*, there are a *lot* of characters missing or
  257. X      out-and-out wrong in Knuth's standard PK files (relative
  258. X      to ROMAN8 ordering).  Particularly box-drawing characters.
  259. X      I've included a couple R, I and B PK files that can be used
  260. X      to have a bit of fun until you have better font files.
  261. X      pk2sfp gives a method of merging PK files - see testmerge
  262. X      entry in utils/Makefile.  R.10.pk, I.10.pk and B.10.pk
  263. X      in the lj.fonts directory were created this way.
  264. X
  265. X      From Hewlett Packard, SFP's usually come on DOS diskettes
  266. X      that can be "cat"'ed to the printer.  These are what you want.
  267. X      Just remember to do BINARY copies from the floppies...
  268. X
  269. X      I got this mail message from Ronald Florence about HPLJ fonts:
  270. X
  271. X        > May 14, 1990 (or thereabouts)
  272. X
  273. X        > I just received a notice in the mail from HP, announcing
  274. X        > that they are about to discontinue the following soft
  275. X        > fonts:
  276. X
  277. X        >     TmsRmn/Helv    Roman 8        (33412AD)
  278. X        >     TmsRmn/Helv    Roman 8        (33412AF)
  279. X        >     TmsRmn/Helv    Ascii        (33412AE)
  280. X
  281. X        > Together, the first two sets provide Times Roman and
  282. X        > Helvetica SFP fonts, including bold and italics, from
  283. X        > 6 to 30 points.  They can be ordered from HP Direct
  284. X        > (800/538-8787).
  285. X
  286. X      These are the fonts that Ronald has been using and they work
  287. X      quite well.  Other soft fonts will probably work, but you
  288. X      may have to tweak the translation tables.
  289. X
  290. X      So, order yours today...  (No, neither of us are in the
  291. X      employ of HP).  You may also be able to get good SFP's
  292. X      from the font archive at Waterloo.
  293. X
  294. X      Alternately, if you have TeX fonts, the file LASERFONTS
  295. X      describes how to make fonts compatible with psroff.
  296. X
  297. X      Software is supplied (utils and widths directories) to
  298. X      extract width information from PK and SFP font files and
  299. X      is built into the makefiles.
  300. X
  301. X    - The width tables supplied (widths/widthps) are in ditroff
  302. X      makedev-input-format (ASCII ditroff width tables).  I've
  303. X      specified them in ditroff format because it's easier to manipulate
  304. X      than CAT troff ft?? or ft??.c files.  dit2catwid/gfnttab convert
  305. X      these width files into ft?? files.  Further, if you're going to
  306. X      use a ditroff backend (tpscript, xtroff etc.) you'll probably
  307. X      need to feed them through the "makedev" utility so that the backend
  308. X      can understand the width tables.  I do not supply a makedev, but
  309. X      one has been posted in comp.sources.unix in 1988, and is available
  310. X      from archive sites such as uunet, it was written by Duane Hesser,
  311. X      dhh@teltone.com) is included with jetroff.  pk2ditwid takes PK and
  312. X      SFP files and produces widthtables compatible with gfnttab (but not
  313. X      necessarily with makedev).
  314. X
  315. X      If you have ditroff, you will HAVE to run the widths through
  316. X      makedev/mkfont.
  317. X
  318. X    - Width tables: Postscript:
  319. X      (<printercommand> is how you sent output to your
  320. X      postscript printer.  You might use "lp -dlaserwriter".)
  321. X      These are in the utils subdirectory:
  322. X
  323. X    showfont: If you type:
  324. X                showfont <fontname> | <printercommand>
  325. X          (eg: showfont Times-Roman) this will dump the entire
  326. X          Postscript Times-Roman font (plus some constructions
  327. X          that troff2ps uses) in a table.  Each character is
  328. X          in a box, along with several numbers.  The number
  329. X          in the center at the bottom of the box is the width
  330. X          in CAT scaling (size of 6 point character in 1/432's).
  331. X          The ditroff width tables are the size of a 10 point
  332. X          character, by default in 1/300's, but can be changed
  333. X          by a resolution directive in a DESC file (eg: widthps
  334. X          is in 1/720's).
  335. X
  336. X    dit2catwid.c: takes ditroff like font tables and converts them
  337. X          to CAT codes suitable for (at least) Xenix troff.
  338. X          (some attempt has been made to make it work for
  339. X          systems that need a.out.h headers on their width
  340. X          tables).  See the gfnttab script to see how it's
  341. X          used.
  342. X
  343. X    gfnttab:  Used to run dit2catwid to compile the width tables
  344. X          and place them in /usr/lib/font/<printer>/ft??.
  345. X          see lib/psrofflib.S
  346. X
  347. X    psdtwid:  fire it off to your Postscript printer, and it
  348. X          will send back a shar file containing ditroff
  349. X          style char tables.  (Neat - thanks Michael!)
  350. X
  351. X          usage:
  352. X            psdtwid | <printercommand>
  353. X
  354. X    widths/widthps/*:   width tables for postscript and ditroff driving
  355. X          postscript.  (Most from tpscript (thanks Michael), but
  356. X          some generated here with psdtwid)
  357. X    widths/width*/*:   other width tables.
  358. X
  359. X    - Width tables: ditroff backends: (eg: jetroff, xtroff, psdit etc.)
  360. X      [It is suggested that you specify the "ps" widths first for testing,
  361. X      and then use the following instructions when fine tuning the widths to
  362. X      get them precisely right]
  363. X    - install the backends *first*.
  364. X    - Find the DESC/R/S/I etc. files that come with the backend, or
  365. X      are generated by installing the backend (eg: jetroff's makefont
  366. X      stuff).
  367. X    - Copy these files to the appropriate widths/width<xx> subdirectory.
  368. X      Notes:
  369. X        - I've used "jt" for jetroff, the jt.fonts file is already
  370. X          at least partially set up.
  371. X        - "ps" is for ditroff->postscript (tpscript) and direct
  372. X          postscript driving and these width files are supplied.
  373. X          And would probably work with other ditroff->postscript
  374. X          converters except for possible character mapping changes
  375. X          (see jt.fonts).
  376. X    - Make in the widths directory will build the ft* files that you
  377. X      need, and make install will install them in the proper places.
  378. X      (normally /usr/lib/font/<xx>/ft*).  These are also done by
  379. X      top level make invocations.
  380. X    - Some ditroff backends (jetroff f'r instance) need to be able
  381. X      to read the "makedev compiled" font files.  For which you need
  382. X      makedev or mkfont (see above).
  383. X
  384. X    - Width tables: HPLJ.  See the installation instructions.
  385. X
  386. X    - There is some code to allow the sending of arbitrary commands to
  387. X      the driver - the ".sR" macro.  This works well unless you're using
  388. X      the ".MT" macro in MM.  sR directives before the ".MT" will
  389. X      confuse MM.  See the manual page for psroff.1 for details on
  390. X      .sR.  Further, ".tm" has been redefined to make use of the
  391. X      .sR facility.
  392. X
  393. X    - psroff has 8-font troff support, but:
  394. X
  395. X        a) it's never been tested.
  396. X        b) I'm no longer convinced that the cat.5 man page is
  397. X           correct on how the decoding works.
  398. X
  399. X    - psroff has BSDHACK support (one of the tilt opcodes being
  400. X      replaced by an opcode to multiply the next vertical motion
  401. X      by 64), but this has not been tested.  I never heard of it
  402. X      before til I saw it in Froyen's troff2lj source.  This cannot
  403. X      be defined at the same time as 8-font support.  Frankly, I
  404. X      can't understand why they bothered - so you save a few opcodes
  405. X      here and there - vcat output is enormous!
  406. X
  407. X    - ".S" files are the source files and are converted to a filename
  408. X      without the suffix by a sedscript that contains the configuration.
  409. X      Whenever you touch the top-level makefile, the sedscript is changed
  410. X      and all of the ".S" files are rebuilt.  If you make a makefile change
  411. X      (eg: configuration), do a "make makefiles" before using submakes.
  412. X      (though, if you simply say make, this will be done for you).  Only
  413. X      change .S files...
  414. X
  415. XSee the MANIFEST for a file-by-file description of the files.
  416. X
  417. XSee the INSTALL file for detailed installation instructions.
  418. X
  419. XFuture directions:
  420. X
  421. XThey are two-fold: replacing the ".tm/.sR" mechanism for communication
  422. Xwith the backend.  There is a new method, using a FSA to recognize
  423. Xa special sequence of bell symbols (see catconv).  I haven't converted
  424. Xover to it, because under some not-yet-understood situations, it
  425. Xdoesn't work.  Hence, psfig and drawing commands occasionally misbehave.
  426. XOnce this is reliable, all special commands (eg: the .fp fakeouts) will
  427. Xbe converted over to the FSA mechanism.
  428. X
  429. XYou may have noticed a compile flag called "OPT" which is defined in
  430. Xthe distributed version of defs.h.  If enabled (via -Z/W), this enables the
  431. Xoptimizer.  It works well with Postscript output, but not with laserjet
  432. Xunless the fonts you use are VERY good.  It's disabled by default.  The
  433. Xoptimizer does two things: it emits as many characters as it can as one
  434. Xprint directive, rather than one CAT code per print.  On postscript and
  435. XHPLJ's this is a BIG win (printer execution speeds 3 or more times faster),
  436. Xbut it won't work with ditroff.  The optimizer requires access to the CAT
  437. Xtroff width tables (even when used with ditroff), and if troff2ps can't find
  438. Xthem, it simply doesn't optimize.
  439. X
  440. XPsroff limitations:
  441. X    - With the use of catconv and CAT troff, psroff supports:
  442. X    - all drawing commands (including the newer \D'fn' (set fill),
  443. X      \D'tn' (line thickness), \D'p x y x y x y ...' (draw polygon),
  444. X      and filled versions of \D'c...', \D'e...', \D'p...' (by capitalizing
  445. X      the letter)).  Drawing commands are NOT supported in HPPCL.
  446. X      (I think I have polygons right, but I don't know whether I got fill
  447. X      parameters correct - "n" is 0...1000, where 0 is all black, and 1000
  448. X      is all white).
  449. X    - psfig.
  450. X    - catconv/CAT Troff and psroff do not support:
  451. X    - \s(nn, \S, \H, \f(xx
  452. X    - Ditroff:
  453. X    - psroff doesn't support character slant (\S) or height (\H).
  454. X    - Psroff only supports CAT troff sizes in HPPCL (some mechanism to relax
  455. X      this for HPLJIII's is easy to implement).  All sizes are available in
  456. X      Postscript and ditroff.
  457. X    - psroff doesn't implement "w" (word breaks in ditroff output).
  458. X    - psroff doesn't support "stipple" (I have NO idea what this is -
  459. X      apparently a Berkeleyism.)
  460. X
  461. XCONTACT INFO (note that I've moved):
  462. X
  463. X    Chris Lewis
  464. X    Elegant Communications Inc.
  465. X    Box 13215, Kanata PO
  466. X    Kanata, Ontario, K2K 1X4
  467. X    Voice Phone: Canada (613) 832-0541
  468. X    Userid's for e-mail contact:
  469. X    Psroff enquiries/help: psroff-request
  470. X    Non-psroff mail only: clewis
  471. X    UUCP routing: uunet!mitel!cunews!latour!ecicrl!<userid>
  472. X    Possible internet routing: <userid>@ferret.ocunix.on.ca
  473. X    Alternate: <user>@eci386.uucp
  474. END_OF_FILE
  475.   if test 20840 -ne `wc -c <'README'`; then
  476.     echo shar: \"'README'\" unpacked with wrong size!
  477.   fi
  478.   # end of 'README'
  479. fi
  480. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  481.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  482. else
  483.   echo shar: Extracting \"'MANIFEST'\" \(9573 characters\)
  484.   sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  485. X   File Name        Archive #    Description
  486. X----------------------------------------------------------
  487. X README                     1    READ ME FIRST!
  488. X MANIFEST                   1    This shipping list
  489. X DITROFF                   15    Ditroff input information
  490. X INSTALL                    8    Installation guide
  491. X LASERFONTS                12    How to build Laserjet fonts from PK's.
  492. X LICENSE                   18    License information
  493. X LJIII                     15    Laserjet III specifics/ LJII improvements
  494. X MISC                       9    Misc. tuning and configuration
  495. X Makefile                   7    Main Makefile
  496. X TROUBLE                    3    psroff problem trouble-shooting guide
  497. X adapters                   1    macro adapter library directory
  498. X adapters/Makefile         19    Makefile for macro adapter libraries.
  499. X adapters/cmn.dit.S        19    ditroff pre-include (.sR etc.)
  500. X adapters/cmn.post.S       10    common post-include-real-macros code
  501. X adapters/cmn.pre.S        19    common pre-include-real-macros code (.sR etc.)
  502. X adapters/tmac.an.S        19    man macro adapter
  503. X adapters/tmac.e.S         19    ME macro adapters
  504. X adapters/tmac.m.S         19    MM macro adapters
  505. X adapters/tmac.s.S         19    MS macro adapters
  506. X adapters/tmac.t2.S        18    A MM macro extension
  507. X audit.S                    8    Configuration auditor
  508. X cattab.c                  10    CAT code/width table index tables
  509. X debug.c                   18    debug print routine (used everywhere)
  510. X defs.h                     9    main definitions.
  511. X dit.c                      4    ditroff frontend
  512. X dt.c                       6    Ditroff driver
  513. X dt.h                      19    Ditroff driver header
  514. X fonts.lj                   1    LJ fonts directory
  515. X fonts.lj/B.10.pk.UU        2    starter set PK font
  516. X fonts.lj/H.10.pk.UU       15    starter set PK font
  517. X fonts.lj/HI.10.pk.UU      13    starter set PK font
  518. X fonts.lj/I.10.pk.UU       13    starter set PK font
  519. X fonts.lj/R.10.pk.UU       14    starter set PK font
  520. X fonts.lj/S.10.pk.UU       14    MATH8 encoded S font PK file
  521. X fonts.lj/S.11.pk.UU       12    MATH8 encoded S font PK file
  522. X fonts.lj/S.12.pk.UU       13    MATH8 encoded S font PK file
  523. X fonts.lj/S.14.pk.UU       12    MATH8 encoded S font PK file
  524. X fonts.lj/S.16.pk.UU        6    MATH8 encoded S font PK file
  525. X fonts.lj/S.18.pk.UU       10    MATH8 encoded S font PK file
  526. X fonts.lj/S.20.pk.UU        8    MATH8 encoded S font PK file
  527. X fonts.lj/S.22.pk.UU        7    MATH8 encoded S font PK file
  528. X fonts.lj/S.24.pk.UU        6    MATH8 encoded S font PK file
  529. X fonts.lj/S.28.pk.UU        5    MATH8 encoded S font PK file
  530. X fonts.lj/S.36.pk.UU        2    MATH8 encoded S font PK file
  531. X fonts.lj/S.6.pk.UU        10    MATH8 encoded S font PK file
  532. X fonts.lj/S.7.pk.UU        15    MATH8 encoded S font PK file
  533. X fonts.lj/S.8.pk.UU        15    MATH8 encoded S font PK file
  534. X fonts.lj/S.9.pk.UU        15    MATH8 encoded S font PK file
  535. X lib                        1    library file directory
  536. X lib/Makefile              19    Library makefile
  537. X lib/confid.ps             18    confidential overlay example
  538. X lib/dj.fonts              19    Deskjet font table
  539. X lib/dj.lib                19    Deskjet prolog
  540. X lib/dt.fonts              19    Ditroff font table
  541. X lib/jt.fonts              19    Jetroff font table
  542. X lib/lethead.ps            18    letterhead overlay example
  543. X lib/lj.fonts               8    Laserjet font table
  544. X lib/lj.lib                18    Laserjet prolog
  545. X lib/lj3.fonts             16    Laserjet III font table
  546. X lib/lj3.lib               18    Laserjet III prolog
  547. X lib/lj3u.fonts            16    Laserjet III font table (Univers primary)
  548. X lib/ps.fonts              18    postscript font table
  549. X lib/ps.lib                 8    postscript prolog
  550. X lib/psrofflib.S           11    psroff shells script configuration table
  551. X lj.c                       2    Laserjet driver
  552. X lj.h                      19    Laserjet driver header file.
  553. X makeincl.S                18    include file for makes
  554. X man                        1    man directory
  555. X man/Makefile              19    Makefile for man pages
  556. X man/asc2ps.1.S            17    ASCII to Postscript converter
  557. X man/cat.5.S               12    Describes CAT codes
  558. X man/dumpft.1.S            15    dumpft manual page.
  559. X man/hpinterp.1.S          13    dumpft manual page.
  560. X man/pk2sfp.1.S             6    pk2sfp/pk2ditwid/pktype man page
  561. X man/psroff.1.S             9    psroff man page
  562. X man/psxlate.1.S           13    manual page for psxlate.
  563. X man/troff2ps.1.S           5    troff2 man page
  564. X opt.c                     14    optimizer
  565. X pk.c                       3    PK/SFP font handler
  566. X pk.h                      18    PK/SFP font handler headers
  567. X pkc.c                     14    PK/SFP cache handler
  568. X pkc.h                     18    PK/SFP cache handler header
  569. X ps.c                       4    Postscript driver
  570. X ps.h                      18    Postscript driver header
  571. X psroff.S                  14    psroff shell script
  572. X t2conf.c                  18    troff2ps driver table
  573. X tests                      1    test files directory
  574. X tests/Makefile            19    Makefile for tests
  575. X tests/chartab.m           15    a test file
  576. X tests/exttab.m            18    test addenda for ditroff input
  577. X tests/ltest.m              3    a test file
  578. X tests/testtab.m           15    short exhaustive test file
  579. X troff2.c                   5    troff2 mainline
  580. X utils                      1    utility program directory
  581. X utils.c                    7    utility functions for troff2
  582. X utils/Makefile            13    utility program makefile
  583. X utils/asc2ps.c            10    Converts ASCII to Postscript
  584. X utils/calcfonts.S          9    perl TeX -> SFP builder
  585. X utils/catconv.S           15    Converts ditroff input to CAT troff input
  586. X utils/dodps.S              1    Kludge to paginate dpsexec (Display Postscript)
  587. X utils/dumpft.c            12    generates interesting stuff
  588. X utils/fonts                1    a couple of interesting PK's
  589. X utils/fonts/README        19    Attribution.
  590. X utils/fonts/cmbx10.pk.UU  12    Useful PK's
  591. X utils/fonts/cmmi10.pk.UU  11    "
  592. X utils/fonts/cmr10.pk.UU   12    "
  593. X utils/fonts/cmsl10.pk.UU  11    "
  594. X utils/fonts/cmss10.pk.UU  13    "
  595. X utils/fonts/cmssi10.pk.UU 11    "
  596. X utils/fonts/cmsy10.pk.UU  10    "
  597. X utils/fonts/cmti10.pk.UU  10    "
  598. X utils/fonts/cmtt10.pk.UU  14    "
  599. X utils/hpinterp.c           1    dumps HPLJ codes in human readable format
  600. X utils/lj2ps.S             19    stupid HPLJ to Postscript converter for testing
  601. X utils/maps                 1    PK->SFP merge maps
  602. X utils/maps/S.cmtrf        19    Extracts cmtrf from S fonts.
  603. X utils/maps/alnum.ROMAN8   19    "
  604. X utils/maps/cmmi.MATH8     19    translate tables for mapping PK's into SFP's
  605. X utils/maps/cmr.MATH8      19    "
  606. X utils/maps/cmr.ROMAN8     19    "
  607. X utils/maps/cmss.ROMAN8    19    "
  608. X utils/maps/cmsy.MATH8     19    "
  609. X utils/maps/cmsy.ROMAN8    19    "
  610. X utils/maps/cmti.MATH8     19    "
  611. X utils/maps/cmti.ROMAN8    19    "
  612. X utils/maps/cmtrf.MATH8    16    "
  613. X utils/maps/cmtrf.ROMAN8    4    "
  614. X utils/maps/cmtt.ROMAN8    19    "
  615. X utils/mkenctab.S          18    converts troff2ps -z into encoding tables
  616. X utils/pk2ditwid.c         14    extracts ditroff format width from PK/SFP fonts
  617. X utils/pk2ps.c             13    PK/SFP dump on Postscript printer
  618. X utils/pk2sfp.c            11    turns PK's/SFP's into SFP's.
  619. X utils/pktype.c            14    human readable dump of PK's and SFP's.
  620. X utils/psdtwd.S             4    uploader of Postscript printer widths
  621. X utils/psxlate.c            7    postscript page flipper
  622. X utils/showfont.S          15    prints sexy postscript font tables
  623. X widths                     1    width files and handlers directory
  624. X widths/Makefile           11    Makefile for width tables
  625. X widths/dit2catwid.c        9    turns ditroff width tables into CAT ones.
  626. X widths/genext.S            5    extracts extended character set for CAT
  627. X widths/gfnttab.S          14    runs dit2catwid/installs width tables
  628. X widths/installdit.S       18    install ditroff widths
  629. X widths/widthjt             1    LJ width tables directory (empty)
  630. X widths/widthlj             1    LJ width tables directory (empty)
  631. X widths/widthlj3            1    LJIII widths
  632. X widths/widthlj3/B         18    "
  633. X widths/widthlj3/DESC      18    HPLJ III width tables
  634. X widths/widthlj3/I         18    "
  635. X widths/widthlj3/R         18    "
  636. X widths/widthlj3/S         18    "
  637. X widths/widthlj3/S2        19    "
  638. X widths/widthlj3/X         18    "
  639. X widths/widthlj3u           1    LJIII widths/Univers base
  640. X widths/widthlj3u/B        18    "
  641. X widths/widthlj3u/DESC     18    HPLJ III Univers width tables
  642. X widths/widthlj3u/I        18    "
  643. X widths/widthlj3u/R        18    "
  644. X widths/widthlj3u/S        18    "
  645. X widths/widthlj3u/X        18    "
  646. X widths/widthps             1    PS width tables directory
  647. X widths/widthps/AB         17    Postscript width files
  648. X widths/widthps/AI         17    "
  649. X widths/widthps/AR         17    "
  650. X widths/widthps/AX         17    "
  651. X widths/widthps/B          16    "
  652. X widths/widthps/BB         16    "
  653. X widths/widthps/BI         16    "
  654. X widths/widthps/BO         16    "
  655. X widths/widthps/BR         16    "
  656. X widths/widthps/BX         16    "
  657. X widths/widthps/C          17    "
  658. X widths/widthps/CB         16    "
  659. X widths/widthps/CO         16    "
  660. X widths/widthps/CX         16    "
  661. X widths/widthps/DESC       18    "
  662. X widths/widthps/H          16    "
  663. X widths/widthps/HB         16    "
  664. X widths/widthps/HO         16    "
  665. X widths/widthps/HX         15    "
  666. X widths/widthps/Hb         17    "
  667. X widths/widthps/Hi         17    "
  668. X widths/widthps/Hr         17    "
  669. X widths/widthps/Hx         17    "
  670. X widths/widthps/I          16    "
  671. X widths/widthps/NB         17    "
  672. X widths/widthps/NI         17    "
  673. X widths/widthps/NR         17    "
  674. X widths/widthps/NX         17    "
  675. X widths/widthps/PB         17    "
  676. X widths/widthps/PI         17    "
  677. X widths/widthps/PR         17    "
  678. X widths/widthps/PX         17    "
  679. X widths/widthps/R          16    "
  680. X widths/widthps/S          16    "
  681. X widths/widthps/S2         11    "
  682. X widths/widthps/ZC         17    "
  683. X widths/widthps/ZD         18    "
  684. END_OF_FILE
  685.   if test 9573 -ne `wc -c <'MANIFEST'`; then
  686.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  687.   fi
  688.   # end of 'MANIFEST'
  689. fi
  690. if test ! -d 'adapters' ; then
  691.     echo shar: Creating directory \"'adapters'\"
  692.     mkdir 'adapters'
  693. fi
  694. if test ! -d 'fonts.lj' ; then
  695.     echo shar: Creating directory \"'fonts.lj'\"
  696.     mkdir 'fonts.lj'
  697. fi
  698. if test ! -d 'lib' ; then
  699.     echo shar: Creating directory \"'lib'\"
  700.     mkdir 'lib'
  701. fi
  702. if test ! -d 'man' ; then
  703.     echo shar: Creating directory \"'man'\"
  704.     mkdir 'man'
  705. fi
  706. if test ! -d 'tests' ; then
  707.     echo shar: Creating directory \"'tests'\"
  708.     mkdir 'tests'
  709. fi
  710. if test ! -d 'utils' ; then
  711.     echo shar: Creating directory \"'utils'\"
  712.     mkdir 'utils'
  713. fi
  714. if test -f 'utils/dodps.S' -a "${1}" != "-c" ; then 
  715.   echo shar: Will not clobber existing file \"'utils/dodps.S'\"
  716. else
  717.   echo shar: Extracting \"'utils/dodps.S'\" \(352 characters\)
  718.   sed "s/^X//" >'utils/dodps.S' <<'END_OF_FILE'
  719. X%%STARTSHELL%%
  720. X# 2.3 91/03/25
  721. Xtrap "rm -f /tmp/cmd$$ \$delete; exit 0" 0 1 2 15
  722. Xif [ "$1" = "-d" ]
  723. Xthen
  724. X    delete=$2
  725. X    shift
  726. Xfi
  727. Xif [ $# != 1 ]
  728. Xthen
  729. X    echo "$0: Missing file argument" >&2
  730. X    exit 1
  731. Xfi
  732. Xcase $1 in
  733. X    /*) file=$1
  734. X    ;;
  735. X    *) file=`pwd`/$1
  736. X    ;;
  737. Xesac
  738. Xecho "($file) run" |
  739. X    cat -u - /dev/tty | /usr/local/bin/dpsexec
  740. Xrm -f /tmp/cmd$$
  741. END_OF_FILE
  742.   if test 352 -ne `wc -c <'utils/dodps.S'`; then
  743.     echo shar: \"'utils/dodps.S'\" unpacked with wrong size!
  744.   fi
  745.   # end of 'utils/dodps.S'
  746. fi
  747. if test ! -d 'utils/fonts' ; then
  748.     echo shar: Creating directory \"'utils/fonts'\"
  749.     mkdir 'utils/fonts'
  750. fi
  751. if test -f 'utils/hpinterp.c' -a "${1}" != "-c" ; then 
  752.   echo shar: Will not clobber existing file \"'utils/hpinterp.c'\"
  753. else
  754.   echo shar: Extracting \"'utils/hpinterp.c'\" \(18443 characters\)
  755.   sed "s/^X//" >'utils/hpinterp.c' <<'END_OF_FILE'
  756. X/*
  757. X    Copyright 1985, 1986, 1987, 1988, 1989, 1990, 1991 Chris Lewis
  758. X        All Rights Reserved
  759. X
  760. X    See the LICENSE file for a full description of restrictions under which
  761. X    this software is provided.
  762. X
  763. X    Function:        interprets HPLJ sequences.
  764. X */
  765. X
  766. X#ifndef    lint
  767. Xstatic char SCCSID[] =
  768. X    "@(#)hpinterp.c 2.4 Copyright 91/03/13 22:44:30 Chris Lewis";
  769. X#endif
  770. X
  771. X/*    To install:
  772. X
  773. X    hpinterp needs to know byte order in shorts.  At run time it
  774. X    will attempt to figure it out.  If you get an abort, or if the
  775. X    results are idiotic:
  776. X
  777. X        If you are little-endian (eg: 386/pdp-11/vax), define SMALLEND.
  778. X        If you are big-endian (eg: pyramid/68000), undef BIGEND.
  779. X
  780. X    cc -o hpinterp hpinterp.c
  781. X
  782. X    Decide on a directory where you're going to run hpinterp and
  783. X    create a directory called "FONTS" (or change the defines for
  784. X    BINFILE and DESCFILE to have a better path).
  785. X
  786. X    usage:
  787. X
  788. X        hpinterp < hpljescapefile > /tmp/output
  789. X
  790. X    /tmp/output will contain an englishy *very* verbose listing
  791. X    of all of the escape sequences except for the contents of
  792. X    font header/download/transfer/raster sequences.
  793. X
  794. X    Each font downloaded is caught into a file FONTS/f<fontnumber>
  795. X    and a bit of english is saved in FONTS/f<fontnumber>.desc.
  796. X    Including some character maps (range restricted by firstchar and
  797. X    lastchar).  You can turn off the verbose output listing by setting
  798. X    verbose to 0.  setting "debug" to 1 (if verbose is 1 too), prints
  799. X    ESC<string> sequences as well as the english.
  800. X
  801. X    (One of these days I'll get it to do all of this stuff by command
  802. X    line options....)
  803. X */
  804. X#include <stdio.h>
  805. X#include <ctype.h>
  806. X#undef    BIGEND
  807. X#undef SMALLEND
  808. X#define    dbprintf(x)    if (verbose) printf x
  809. X#define    ESCAPE    0x1b
  810. X
  811. X#define    uchar    unsigned char
  812. Xint firstchar = 0;
  813. Xint lastchar = 0xff;
  814. X
  815. Xtypedef int(*FUNC)();
  816. X
  817. Xint lastschar;
  818. Xint lastfontid;
  819. X
  820. Xdouble curX = 0, curY = 0;
  821. Xint emitting = 0;
  822. X
  823. XFILE *out = (FILE *) NULL;
  824. XFILE *txtout = (FILE *) NULL;
  825. Xint count = 0;
  826. Xint verbose = 0;
  827. Xint debug = 0;
  828. Xint genps = 0;
  829. Xint chars = 0;
  830. Xint characteristic = 1;
  831. Xint ps_symset = 0;
  832. X
  833. Xshort canon();
  834. X
  835. Xreadhex(len)
  836. Xint len; {
  837. X    while(len--) GETCHAR();
  838. X}
  839. X
  840. XGETCHAR() {
  841. X    int c;
  842. X    c = getchar();
  843. X#ifdef    DEBUG
  844. X    if (isprint(c))
  845. X    printf("GETCHAR: %c\n", c);
  846. X    else
  847. X    printf("GETCHAR: %02x\n", c);
  848. X#endif
  849. X    return(c);
  850. X}
  851. X
  852. X#define    TRANSFER    1
  853. X#define    TRANSPARENT    2
  854. X#define    FONTHEADER    3
  855. X#define    DOWNLOAD    4
  856. Xstruct fontdesc {
  857. X    short f1;
  858. X    uchar f2;
  859. X    uchar fd_type;
  860. X    short f3;
  861. X    short fd_base;
  862. X    short fd_cellwidth;
  863. X    short fd_cellheight;
  864. X    uchar fd_orientation;
  865. X    uchar fd_fixedprop;
  866. X    short fd_symset;
  867. X    short fd_pitch;
  868. X    short fd_height;
  869. X    short f4;
  870. X    uchar f5;
  871. X    uchar fd_style;
  872. X    uchar fd_weight;
  873. X    uchar fd_typeface;
  874. X};
  875. X
  876. Xstruct download {
  877. X    uchar f1;
  878. X    uchar f2;
  879. X    uchar f3;
  880. X    uchar f4;
  881. X    uchar dl_orientation;
  882. X    short dl_leftoffset;
  883. X    short dl_topoffset;
  884. X    short dl_charwidth;
  885. X    short dl_charheight;
  886. X    short dl_deltax;
  887. X    uchar  dl_data[1];
  888. X};
  889. X
  890. Xchar    *fchcont[] = {
  891. X    "Delete all fonts",
  892. X    "Delete all temporary fonts",
  893. X    "Delete last font ID specified",
  894. X    "Delete last font ID and char code",
  895. X    "Make Temp font",
  896. X    "Make Perm font",
  897. X    "Copy/Assign",
  898. X    NULL};
  899. Xchar *spcont[] = {
  900. X    "Fixed",
  901. X    "Proportional",
  902. X    NULL};
  903. Xchar *stcont[] = {
  904. X    "Upright",
  905. X    "Italic",
  906. X    NULL};
  907. Xchar *tfcont[] = {
  908. X    "Line Printer",
  909. X    "Pica",
  910. X    "Elite",
  911. X    "Courier",
  912. X    "Helvetica",
  913. X    "Times Roman",
  914. X    "Gothic",
  915. X    "Script",
  916. X    "Prestige Elite",
  917. X    "Caslon",
  918. X    "Orator",
  919. X    NULL};
  920. Xchar *sgcont[] = {
  921. X    "Left-most position",
  922. X    "Current Cursor",
  923. X    NULL};
  924. Xchar *pscont[] = {
  925. X    "Disable",
  926. X    "Enable",
  927. X    NULL};
  928. X
  929. X
  930. Xint    movex(),movey(), papinctrl(), movedx(), movedy();
  931. Xint    spset(), psset(), styset(), strset(), tfset();
  932. X
  933. Xstruct intlist {
  934. X    char *code;
  935. X    char *name;
  936. X    char **parmnames;
  937. X    FUNC exec;
  938. X} intlist[] = {
  939. X    {"&lO",    "Orientation"},
  940. X    {"(sP",    "Spacing", spcont, spset},
  941. X    {"(sH",    "Pitch"},
  942. X    {"(sV",    "Point Size", NULL, psset},
  943. X    {"(sS",    "Style", stcont, styset},
  944. X    {"(sB",    "Stroke", NULL, strset},
  945. X    {"(sT",    "Typeface", tfcont, tfset},
  946. X    {"&lP",    "Page Length"},
  947. X    {"&lE",    "Top Margin"},
  948. X    {"&lF",    "Text Length"},
  949. X    {"&aL",    "Left Margin"},
  950. X    {"&aM",    "Right Margin"},
  951. X    {"&lC",    "Motion Index"},
  952. X    {"&lD",    "Lines/Inch"},
  953. X    {"*tR",    "Resolution"},
  954. X    {"*rA",    "Start Graphics", sgcont},
  955. X    {"*bW",    "Transfer"},
  956. X    {"*rB",    "End Graphics"},
  957. X    {"&aR",    "Move to Row"},
  958. X    {"&aC",    "Move to Column"},
  959. X    {"&aH",    "Move to Column (Decipoints)", NULL, movex},
  960. X    {"&aV",    "Move to Row (Decipoints)", NULL, movey},
  961. X    {"&dD",    "Underline on"},
  962. X    {"&d@",    "Underline off"},
  963. X    {"&pX",    "Transparent Print"},
  964. X    {"&lL",    "Perf Skip", pscont},
  965. X    {"&kH",    "HMI"},
  966. X    {"&kS",    "Font Pitch"},
  967. X    {"&kG",    "Line Termination"},
  968. X    {"&sC",    "Line Wrap"},
  969. X    {"&lX",    "Number of Copies"},
  970. X    {"&lH",    "Paper Input Control", NULL, papinctrl},
  971. X    {"*pX",    "Horizontal cursor (dots)", NULL, movedx},
  972. X    {"*pY",    "Vertical cursor (dots)", NULL, movedy},
  973. X    {"*cD",    "Font ID"},
  974. X    {"*cE",    "Character Code"},
  975. X    {"*cF",    "Font/Char control", fchcont},
  976. X    {")sW",    "Create Font Header"},
  977. X    {"(sW",    "Download Character"},
  978. X    {"&fY",    "Macro ID"},
  979. X    {"&fX",    "Macro control"},
  980. X    {"&fS",    "Push/Pop"},
  981. X    {"*cA",    "Horizontal Rule/Pattern Size"},
  982. X    {"*cH",    "Horizontal Rule/Pattern Size"},
  983. X    {"*cB",    "Vertical Rule/Pattern Size"},
  984. X    {"*cV",    "Vertical Rule/Pattern Size"},
  985. X    {"*cP",    "Print Rule/Pattern"},
  986. X    {"*cG",    "Grey scale/pattern id"},
  987. X    {"&lT",    "Job offset control"},
  988. X    {NULL,NULL}
  989. X};
  990. X
  991. Xunion {
  992. X    struct fontdesc b_fd;
  993. X    struct download b_dl;
  994. X    char b_buffer[2048];
  995. X} buffer;
  996. X
  997. Xinterp(prefix, anchor, number, suffix)
  998. Xchar prefix, anchor, suffix;
  999. Xdouble number; {
  1000. X    int multi;
  1001. X    register int i;
  1002. X    char lookup[4];
  1003. X
  1004. X    if (debug)
  1005. X    dbprintf(("ESC%c%c%g%c\n", prefix, anchor, number, suffix));
  1006. X
  1007. X    if (islower(suffix))
  1008. X    suffix = toupper(suffix);
  1009. X
  1010. X    sprintf(lookup, "%c%c%c", prefix, anchor, suffix);
  1011. X    for (i = 0; intlist[i].code; i++) {
  1012. X    if (0 == strcmp(intlist[i].code, lookup)) {
  1013. X        dbprintf(("%s:", intlist[i].name));
  1014. X        if (intlist[i].parmnames) {
  1015. X        int j;
  1016. X        for (j = 0; j < number; j++) {
  1017. X            if (!intlist[i].parmnames[j])
  1018. X            break;
  1019. X        }
  1020. X        if (intlist[i].parmnames[j]) {
  1021. X            dbprintf((" %s\n", intlist[i].parmnames[j]));
  1022. X        } else {
  1023. X            dbprintf((" %d\n", (int) number));
  1024. X        }
  1025. X        } else {
  1026. X        dbprintf ((" %g\n", number));
  1027. X        }
  1028. X        if (intlist[i].exec)
  1029. X        (*intlist[i].exec)(number);
  1030. X        break;
  1031. X    }
  1032. X    }
  1033. X
  1034. X    multi = 0;
  1035. X    /* For parsing variable length ones */
  1036. X    switch(prefix) {
  1037. X    case '*':
  1038. X        if (anchor == 'b' && suffix == 'W')
  1039. X        multi = TRANSFER;
  1040. X        break;
  1041. X    case '&':
  1042. X        if (anchor == 'p' && suffix == 'X')
  1043. X        multi = TRANSPARENT;
  1044. X        break;
  1045. X    case ')':
  1046. X        if (anchor == 's' && suffix == 'W')
  1047. X        multi = FONTHEADER;
  1048. X        break;
  1049. X    case '(':
  1050. X        if (anchor == 's' && suffix == 'W')
  1051. X        multi = DOWNLOAD;
  1052. X        break;
  1053. X    }
  1054. X    if (prefix == '*' && anchor == 'c' && suffix == 'E') {
  1055. X    lastschar = number;
  1056. X    }
  1057. X    if (prefix == '*' && anchor == 'c' && suffix == 'D') {
  1058. X    lastfontid = number;
  1059. X    }
  1060. X    if (multi)
  1061. X    readdesc(multi, (int) number);
  1062. X}
  1063. X
  1064. X#ifdef    SMALLEND
  1065. X#define    smallend    1
  1066. X#endif
  1067. X#ifdef    BIGEND
  1068. X#define    smallend    0
  1069. X#endif
  1070. X
  1071. X#if    !defined(SMALLEND) && !defined(BIGEND)
  1072. Xunion    t {
  1073. X    char a[2];
  1074. X    short b;
  1075. X};
  1076. Xint    smallend;
  1077. X#endif
  1078. X
  1079. Xshort
  1080. Xcanon(v)
  1081. Xshort v; {
  1082. X    if (smallend) {
  1083. X    return(((v & 0xff) << 8) | ((v&0xff00) >> 8));
  1084. X    } else
  1085. X    return(v);
  1086. X}
  1087. X
  1088. X#define    BINFILE        "FONTS/f%d"
  1089. X#define    DESCFILE    "FONTS/f%d.desc"
  1090. X
  1091. Xreaddesc(type, bytecount)
  1092. Xint type; int bytecount; {
  1093. X    int points;
  1094. X    char *typeface;
  1095. X    char *style;
  1096. X    char filename[1000];
  1097. X    switch(type) {
  1098. X    default:
  1099. X        readhex(bytecount);
  1100. X        break;
  1101. X    case DOWNLOAD:
  1102. X        fread((char *) &buffer, 1, bytecount, stdin);
  1103. X        sprintf(filename, BINFILE, lastfontid);
  1104. X        if (out) fclose(out);
  1105. X        if ((out = fopen(filename, "a")) == NULL) {
  1106. X        fprintf(stderr, "Can't open %s\n", filename);
  1107. X        out = NULL;
  1108. X        }
  1109. X        sprintf(filename, DESCFILE, lastfontid);
  1110. X        if (txtout) fclose(txtout);
  1111. X        if ((txtout = fopen(filename, "a")) == NULL) {
  1112. X        fprintf(stderr, "Can't open %s\n", filename);
  1113. X        txtout = NULL;
  1114. X        }
  1115. X        if (lastschar >= firstchar && lastschar <= lastchar) {
  1116. X        if (txtout) {
  1117. X            fprintf(txtout, "Character: %c\n", lastschar);
  1118. X            fprintf(txtout, "  orientation: %d\n",
  1119. X            buffer.b_dl.dl_orientation);
  1120. X            fprintf(txtout, "  leftoffset: %d\n",
  1121. X            canon(buffer.b_dl.dl_leftoffset));
  1122. X            fprintf(txtout, "  topoffset: %d\n",
  1123. X            canon(buffer.b_dl.dl_topoffset));
  1124. X            fprintf(txtout, "  charwidth: %d\n",
  1125. X            canon(buffer.b_dl.dl_charwidth));
  1126. X            fprintf(txtout, "  charheight: %d\n",
  1127. X            canon(buffer.b_dl.dl_charheight));
  1128. X            fprintf(txtout, "  deltax: %d\n",
  1129. X            canon(buffer.b_dl.dl_deltax));
  1130. X            if (chars)
  1131. X            plotchars(txtout, &buffer.b_dl);
  1132. X        }
  1133. X        }
  1134. X        if (out) {
  1135. X        fprintf(out, "\033*c%dE", lastschar);
  1136. X        fprintf(out, "\033(s%dW", bytecount);
  1137. X        fwrite((char *) &buffer, 1, bytecount, out);
  1138. X        }
  1139. X        break;
  1140. X
  1141. X    case FONTHEADER:
  1142. X        if (txtout) fclose(txtout);
  1143. X        if (out) fclose(out);
  1144. X
  1145. X        fread((char *) &buffer, 1, bytecount, stdin);
  1146. X        points = (double) canon(buffer.b_fd.fd_height) * 72 / 4 / 300 + .5;
  1147. X        switch(buffer.b_fd.fd_typeface) {
  1148. X        case 0: typeface = "Line Printer"; break;
  1149. X        case 1: typeface = "Pica"; break;
  1150. X        case 2: typeface = "Elite"; break;
  1151. X        case 3: typeface = "Courier"; break;
  1152. X        case 4: typeface = "Helvetica"; break;
  1153. X        case 5: typeface = "Times-Roman"; break;
  1154. X        case 6: typeface = "Gothic"; break;
  1155. X        case 7: typeface = "Script"; break;
  1156. X        case 8: typeface = "Prestige"; break;
  1157. X        case 9: typeface = "Caslon"; break;
  1158. X        case 10: typeface = "Orator"; break;
  1159. X        default: typeface = "               ";
  1160. X            sprintf(typeface, "T%d", buffer.b_fd.fd_typeface);
  1161. X            break;
  1162. X        }
  1163. X        switch(buffer.b_fd.fd_style) {
  1164. X        case 0:
  1165. X            style = "Upright";
  1166. X            break;
  1167. X        case 1:
  1168. X            style = "Italic";
  1169. X            break;
  1170. X        }
  1171. X        sprintf(filename, BINFILE, lastfontid);
  1172. X        if ((out = fopen(filename, "w")) == NULL) {
  1173. X        fprintf(stderr, "Can't open %s\n", filename);
  1174. X        out = NULL;
  1175. X        }
  1176. X        sprintf(filename, DESCFILE, lastfontid);
  1177. X        if ((txtout = fopen(filename, "w")) == NULL) {
  1178. X        fprintf(stderr, "Can't open %s\n", filename);
  1179. X        txtout = NULL;
  1180. X        }
  1181. X        /*fprintf(out, "\033*c%dD", lastfontid);*/
  1182. X        fprintf(out, "\033)s%dW", bytecount);
  1183. X        fwrite((char *) &buffer, 1, bytecount, out);
  1184. X        if (txtout) {
  1185. X        fprintf(txtout, "Height: %d\n", canon(buffer.b_fd.fd_height));
  1186. X        fprintf(txtout, "  Points (rounded): %d\n", points);
  1187. X        fprintf(txtout, "  Points (floating): %.2f\n",
  1188. X            (double) canon(buffer.b_fd.fd_height) * 72 / 4 / 300);
  1189. X        fprintf(txtout, "Pitch: %d\n", canon(buffer.b_fd.fd_pitch));
  1190. X        fprintf(txtout, "  Pitch (chars/inch): %d\n",
  1191. X            4 * 300 / canon(buffer.b_fd.fd_pitch));
  1192. X        if (buffer.b_fd.fd_fixedprop)
  1193. X            fprintf(txtout, "Proportional width font\n");
  1194. X        else
  1195. X            fprintf(txtout, "Fixed width font\n");
  1196. X        fprintf(txtout, "Stroke weight: %d\n", buffer.b_fd.fd_weight);
  1197. X        fprintf(txtout, "Style: %d; (%s)\n", buffer.b_fd.fd_style,
  1198. X            style);
  1199. X        fprintf(txtout, "Typeface: %d; (%s)\n", buffer.b_fd.fd_typeface,
  1200. X            typeface);
  1201. X        fprintf(txtout, "Symset: %04x; (%d%c)\n",
  1202. X            canon(buffer.b_fd.fd_symset),
  1203. X            canon(buffer.b_fd.fd_symset) >> 5,
  1204. X            (canon(buffer.b_fd.fd_symset) & 0x1f) + 'A' - 1);
  1205. X
  1206. X        fprintf(txtout, "Type: %x\n", buffer.b_fd.fd_type);
  1207. X        fprintf(txtout, "Base: %d\n", canon(buffer.b_fd.fd_base));
  1208. X        fprintf(txtout, "Cellwidth: %d\n", canon(buffer.b_fd.fd_cellwidth));
  1209. X        fprintf(txtout, "Cellheight: %d\n", canon(buffer.b_fd.fd_cellheight));
  1210. X        fprintf(txtout, "Orientation: %d\n", buffer.b_fd.fd_orientation);
  1211. X        fprintf(txtout, "Height: %d\n", canon(buffer.b_fd.fd_height));
  1212. X        }
  1213. X    }
  1214. X}
  1215. X
  1216. Xplotchars(f, dl)
  1217. Xstruct download *dl;
  1218. XFILE *f; {
  1219. X    short x, y, bx, by, bytes, byteindex, bitindex, bit;
  1220. X    bytes = (canon(dl->dl_charwidth) + 7) / 8;
  1221. X    for (y = 0; y < canon(dl->dl_charheight); y++) {
  1222. X    fprintf(f, "        ");
  1223. X    for (x = 0; x < (canon(dl->dl_charwidth) + canon(dl->dl_leftoffset));
  1224. X        x++) {
  1225. X        bx = x - canon(dl->dl_leftoffset);
  1226. X        by = y;
  1227. X        if (bx >= 0) {
  1228. X        byteindex = bytes * by + bx / 8;
  1229. X        bitindex = (7 - (bx % 8));
  1230. X        if (dl->dl_data[byteindex] & (1 << bitindex))
  1231. X            bit = 'X';
  1232. X        else
  1233. X            bit = ' ';
  1234. X        } else
  1235. X        bit = ' ';
  1236. X        if (x == 0 && y == canon(dl->dl_topoffset))
  1237. X        bit = '+';
  1238. X        if (bit == ' ' && y == canon(dl->dl_topoffset))
  1239. X        bit = '=';
  1240. X        fputc(bit, f);
  1241. X    }
  1242. X    fputc('\n',f);
  1243. X    }
  1244. X}
  1245. X
  1246. X
  1247. X/*    We've got ESC<prefix><anchor>
  1248. X *    read number/suffix pairs
  1249. X */
  1250. Xmultisequence(prefix, anchor)
  1251. Xchar prefix, anchor; {
  1252. X    int c, neg, seendot;
  1253. X    double v;
  1254. X    while(1) {
  1255. X    v = 0;
  1256. X    seendot = 0;
  1257. X    neg = 1;
  1258. X    while(isdigit(c = GETCHAR()) || (c == '.') || (c == '-') || (c == '+')) {
  1259. X        if (c == '+') {
  1260. X        continue;
  1261. X        }
  1262. X        if (c == '.') {
  1263. X        seendot = 10;
  1264. X        continue;
  1265. X        }
  1266. X        if (c == '-') {
  1267. X        neg *= -1;
  1268. X        continue;
  1269. X        }
  1270. X        if (seendot) {
  1271. X        v += (double) (c - '0') / seendot;
  1272. X        seendot *= 10;
  1273. X        } else
  1274. X        v = v * 10 + c - '0';
  1275. X    }
  1276. X    v *= neg;
  1277. X    interp(prefix, anchor, v, c);
  1278. X    if (!islower(c))
  1279. X        break;
  1280. X    }
  1281. X}
  1282. X
  1283. Xprinthex(buf, n)
  1284. Xchar *buf; int n; {
  1285. X    int i;
  1286. X    dbprintf(("SEQ:"));
  1287. X    for (i = 0; i < n; i++) {
  1288. X    if (isprint(buf[i]))
  1289. X        putchar(buf[i]);
  1290. X    else {
  1291. X        dbprintf(("\\%02x", buf[i]));
  1292. X    }
  1293. X    }
  1294. X    dbprintf(("\n"));
  1295. X}
  1296. X
  1297. Xshort pts[] = {6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 36, 4, 4};
  1298. Xreadescape() {
  1299. X    int c, v, v1, v2, v3;
  1300. X    c = GETCHAR();
  1301. X    switch(c) {
  1302. X    case '9':
  1303. X        dbprintf(("Clear Margins\n"));
  1304. X        return;
  1305. X    case '=':
  1306. X        dbprintf(("Half linefeed\n"));
  1307. X        return;
  1308. X    case 'E':
  1309. X        dbprintf(("Reset\n"));
  1310. X        return;
  1311. X    case 'z':
  1312. X        dbprintf(("Self test\n"));
  1313. X        return;
  1314. X    case 'Y':
  1315. X        dbprintf(("Display functions on\n"));
  1316. X        return;
  1317. X    case 'Z':
  1318. X        dbprintf(("Display functions off\n"));
  1319. X        return;
  1320. X    case ')':
  1321. X        c = GETCHAR();
  1322. X        if (isdigit(c)) {
  1323. X        v = 0;
  1324. X        while(isdigit(c)) {
  1325. X            v = v * 10 + c - '0';
  1326. X            c = GETCHAR();
  1327. X        }
  1328. X        switch(c) {
  1329. X            case 'X':
  1330. X            dbprintf(("Secondary font %d\n", v));
  1331. X            break;
  1332. X            case '@':
  1333. X            dbprintf(("Secondary font value %d\n", v));
  1334. X            break;
  1335. X            default:
  1336. X            dbprintf(("HUH ESC)%d%c\n", v, c));
  1337. X        }
  1338. X        return;
  1339. X        }
  1340. X        multisequence(')', c);
  1341. X        return;
  1342. X    case '(':
  1343. X        c = GETCHAR();
  1344. X        if (isdigit(c)) {
  1345. X        v = 0;
  1346. X        while(isdigit(c)) {
  1347. X            v = v * 10 + c - '0';
  1348. X            c = GETCHAR();
  1349. X        }
  1350. X        switch(c) {
  1351. X            case 'X':
  1352. X            dbprintf(("Primary font %d\n", v));
  1353. X            if (genps) {
  1354. X                endemit();
  1355. X                characteristic = 0;
  1356. X                printf("/f%d findfont %d scalefont setfont\n",
  1357. X                v, pts[v&0xf]);
  1358. X            }
  1359. X            break;
  1360. X            case '@':
  1361. X            dbprintf(("Primary font value %d\n", v));
  1362. X            break;
  1363. X            default:
  1364. X            dbprintf(("Symbol set: %d%c\n", v, c));
  1365. X            ps_symset = c;
  1366. X        }
  1367. X        return;
  1368. X        }
  1369. X        multisequence('(', c);
  1370. X        return;
  1371. X    case '&':
  1372. X        c = GETCHAR();
  1373. X        multisequence('&', c);
  1374. X        return;
  1375. X    case '*':
  1376. X        c = GETCHAR();
  1377. X        multisequence('*', c);
  1378. X        return;
  1379. X    default:
  1380. X        dbprintf(("Huh? %02x\n", c));
  1381. X        return;
  1382. X    }
  1383. X}
  1384. X
  1385. Xmain(argc, argv)
  1386. Xint argc; char **argv; {
  1387. X    int c;
  1388. X    extern char *optarg;
  1389. X
  1390. X#if    !defined(BIGEND) && !defined(SMALLEND)
  1391. X    union t ta;
  1392. X    ta.a[0] = 0x01;
  1393. X    ta.a[1] = 0x02;
  1394. X    smallend = ((ta.b&0xff) == 0x01);
  1395. X#endif
  1396. X    while((c = getopt(argc, argv, "dpv")) != EOF)
  1397. X    switch(c) {
  1398. X        case 'p':
  1399. X        genps++;
  1400. X        break;
  1401. X        case 'v':
  1402. X        verbose++;
  1403. X        break;
  1404. X        case 'd':
  1405. X        debug++;
  1406. X        break;
  1407. X        case '?':
  1408. X        fprintf(stderr, "usage: hpinterp [-d][-p][-v]< file");
  1409. X        exit(1);
  1410. X    }
  1411. X
  1412. X
  1413. X    if (genps) {
  1414. X    printf("/M { moveto } def\n");
  1415. X    printf("/S { show } def\n");
  1416. X    }
  1417. X    while((c = GETCHAR()) != EOF) {
  1418. X    if (c == ESCAPE) {
  1419. X        readescape();
  1420. X    } else {
  1421. X        if (isprint(c)) {
  1422. X        dbprintf(("Char: %c\n", c));
  1423. X        } else {
  1424. X        dbprintf(("Char: 0x%02x\n", c));
  1425. X        }
  1426. X        emitchar(c);
  1427. X    }
  1428. X    }
  1429. X    if (out) fclose(out);
  1430. X    if (txtout) fclose(txtout);
  1431. X    endemit();
  1432. X}
  1433. X
  1434. Xmovex(num)
  1435. Xdouble num; {
  1436. X    curX = num;
  1437. X    endemit();
  1438. X}
  1439. X
  1440. Xmovey(num)
  1441. Xdouble num; {
  1442. X    curY = num;
  1443. X    endemit();
  1444. X}
  1445. X
  1446. Xmovedx(num)
  1447. Xdouble num; {
  1448. X    curX = num * 720 / 300;
  1449. X    endemit();
  1450. X}
  1451. X
  1452. Xmovedy(num)
  1453. Xdouble num; {
  1454. X    curY = num * 720 / 300;
  1455. X    endemit();
  1456. X}
  1457. X
  1458. Xemitchar(c)
  1459. Xint c; {
  1460. X    if (!genps)
  1461. X    return;
  1462. X
  1463. X    if (characteristic)
  1464. X    selchar();
  1465. X
  1466. X    if (!emitting)
  1467. X    printf("%g %g M(", curX/10, (72 * 11) - (curY/10));
  1468. X
  1469. X    emitting = 1;
  1470. X
  1471. X    switch(c) {
  1472. X    case '(': case ')': case '\\':
  1473. X        printf("\\%c", c);
  1474. X        break;
  1475. X    default:
  1476. X        if (c > ' ' && c < 0x7e)
  1477. X        printf("%c", c);
  1478. X        else
  1479. X        printf("\\%03o", c&0xff);
  1480. X        break;
  1481. X    }
  1482. X}
  1483. X
  1484. Xendemit() {
  1485. X    if (emitting)
  1486. X    printf(")S\n");
  1487. X    emitting = 0;
  1488. X}
  1489. X
  1490. Xpapinctrl(num)
  1491. Xdouble num; {
  1492. X    int n = num;
  1493. X    if (num == 0) {
  1494. X    endemit();
  1495. X    if (genps)
  1496. X        printf("showpage\n");
  1497. X    }
  1498. X}
  1499. X
  1500. Xint ps_pointsize = 10;
  1501. Xint ps_style = 1;
  1502. Xint ps_stroke = 0;
  1503. Xint ps_tface = 5;
  1504. Xint ps_spacing = 0;
  1505. X
  1506. Xspset(num)
  1507. Xdouble num; {
  1508. X    ps_spacing = num;
  1509. X    characteristic = 1;
  1510. X    endemit();
  1511. X}
  1512. Xpsset(num)
  1513. Xdouble num; {
  1514. X    characteristic = 1;
  1515. X    ps_pointsize = num;
  1516. X    endemit();
  1517. X}
  1518. Xstyset(num)
  1519. Xdouble num; {
  1520. X    characteristic = 1;
  1521. X    ps_style = num;
  1522. X    endemit();
  1523. X}
  1524. Xstrset(num)
  1525. Xdouble num; {
  1526. X    characteristic = 1;
  1527. X    ps_stroke = num;
  1528. X    endemit();
  1529. X}
  1530. Xtfset(num)
  1531. Xdouble num; {
  1532. X    characteristic = 1;
  1533. X    ps_tface = num;
  1534. X    endemit();
  1535. X}
  1536. X
  1537. X#define    TMS    "Times-Roman", "Times-Italic", "Times-Bold", "Times-BoldItalic"
  1538. X#define COUR    "Courier", "Courier-Oblique", "Courier-Bold",\
  1539. X    "Courier-BoldOblique"
  1540. X#define HELV    "Helvetica", "Helvetica-Oblique", "Helvetica-Bold",\
  1541. X    "Helvetica-BoldOblique"
  1542. X
  1543. X#define    LAST    7
  1544. X
  1545. Xchar *fonts[LAST][4] = {{COUR}, {COUR}, {COUR}, {COUR}, {HELV}, {TMS},
  1546. X    {COUR}};
  1547. X
  1548. Xselchar() {
  1549. X    int idx = 0;
  1550. X    char **font;
  1551. X    char *p;
  1552. X#ifdef    NEVER
  1553. X    printf("ps_pointsize: %d\n", ps_pointsize);
  1554. X    printf("ps_style: %d\n", ps_style);
  1555. X    printf("ps_stroke: %d\n", ps_stroke);
  1556. X    printf("ps_symset: %d\n", ps_symset);
  1557. X    printf("ps_tface: %d\n", ps_tface);
  1558. X    printf("ps_spacing: %d\n", ps_spacing);
  1559. X#endif
  1560. X    if (ps_tface == 4101)    /* CG Roman on LJ III */
  1561. X    ps_tface = 5;
  1562. X    if (ps_tface == 4148)    /* CG Univers (Helvetica like) Roman on LJ III */
  1563. X    ps_tface = 4;
  1564. X    if (ps_tface >= LAST || ps_tface < 0)
  1565. X    ps_tface = 3;
  1566. X    idx = 0;
  1567. X    if (ps_stroke > 0)
  1568. X    idx = 2;
  1569. X    if (ps_style != 0)
  1570. X    idx++;
  1571. X    if (ps_symset == 'M')
  1572. X    p = "Symbol";
  1573. X    else
  1574. X    p = fonts[ps_tface][idx];
  1575. X    printf("/%s findfont %d scalefont setfont\n", p, ps_pointsize);
  1576. X    characteristic = 0;
  1577. X}
  1578. END_OF_FILE
  1579.   if test 18443 -ne `wc -c <'utils/hpinterp.c'`; then
  1580.     echo shar: \"'utils/hpinterp.c'\" unpacked with wrong size!
  1581.   fi
  1582.   # end of 'utils/hpinterp.c'
  1583. fi
  1584. if test ! -d 'utils/maps' ; then
  1585.     echo shar: Creating directory \"'utils/maps'\"
  1586.     mkdir 'utils/maps'
  1587. fi
  1588. if test ! -d 'widths' ; then
  1589.     echo shar: Creating directory \"'widths'\"
  1590.     mkdir 'widths'
  1591. fi
  1592. if test ! -d 'widths/widthjt' ; then
  1593.     echo shar: Creating directory \"'widths/widthjt'\"
  1594.     mkdir 'widths/widthjt'
  1595. fi
  1596. if test ! -d 'widths/widthlj' ; then
  1597.     echo shar: Creating directory \"'widths/widthlj'\"
  1598.     mkdir 'widths/widthlj'
  1599. fi
  1600. if test ! -d 'widths/widthlj3' ; then
  1601.     echo shar: Creating directory \"'widths/widthlj3'\"
  1602.     mkdir 'widths/widthlj3'
  1603. fi
  1604. if test ! -d 'widths/widthlj3u' ; then
  1605.     echo shar: Creating directory \"'widths/widthlj3u'\"
  1606.     mkdir 'widths/widthlj3u'
  1607. fi
  1608. if test ! -d 'widths/widthps' ; then
  1609.     echo shar: Creating directory \"'widths/widthps'\"
  1610.     mkdir 'widths/widthps'
  1611. fi
  1612. echo shar: End of archive 1 \(of 19\).
  1613. cp /dev/null ark1isdone
  1614. MISSING=""
  1615. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do
  1616.     if test ! -f ark${I}isdone ; then
  1617.     MISSING="${MISSING} ${I}"
  1618.     fi
  1619. done
  1620. if test "${MISSING}" = "" ; then
  1621.     echo You have unpacked all 19 archives.
  1622.     echo "Read the README to get started with psroff installation"
  1623.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1624. else
  1625.     echo You still must unpack the following archives:
  1626.     echo "        " ${MISSING}
  1627. fi
  1628. exit 0
  1629.  
  1630. exit 0 # Just in case...
  1631.